package utilities;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * Clase utilitaria para ejecutar subprocesos
 * @author Ricardo Sansores
 */
public class ProcessExecutor {

    /**
     * Intenta ejecutar el comando proporcionado y envía la salida del comando
     * a la salida estadar de java.
     * @param command El comando que se desea ejecutar
     * @throws IOException 
     */
    private static void executeBlocking(Object command) throws IOException {
        // A Runtime object has methods for dealing with the OS
        Runtime r = Runtime.getRuntime();
        Process p;     // Process tracks one external native process
        BufferedReader is;  // reader for output of process
        String line;

        // Our argv[0] contains the program to run; remaining elements
        // of argv contain args for the target program. This is just
        // what is needed for the String[] form of exec.
        if(command instanceof String){
            p = r.exec((String)command);
        }else{
            p = r.exec((String[])command);
        }

        System.out.println("In Main after exec");

        // getInputStream gives an Input stream connected to
        // the process p's standard output. Just use it to make
        // a BufferedReader to readLine() what the program writes out.
        is = new BufferedReader(new InputStreamReader(p.getInputStream()));

        while ((line = is.readLine()) != null) {
            System.out.println(line);
        }
        try {
            p.waitFor();  // wait for process to complete
        } catch (InterruptedException e) {
            System.err.println(e);  // "Can'tHappen"
            return;
        }
        System.err.println("Process done, exit status was " + p.exitValue());
        return;
    }
    
    /**
     * Ejecuta un comando como un nuevo proceso y envía a la salida estandar
     * la salidas de dicho proceso para finalmente imprimir el resultado del proceso.
     * El método se bloquea hasta que el subproceso termina.
     * @param command
     * @throws IOException 
     */
    public static void execute(String command) throws IOException {
        executeBlocking(command);
    }
    
    /**
     * Ejecuta un comando como un nuevo proceso y envía a la salida estandar
     * la salidas de dicho proceso para finalmente imprimir el resultado del proceso.
     * El método se bloquea hasta que el subproceso termina.
     * @param command
     * @throws IOException 
     */
    public static void execute(String[] command) throws IOException {
        executeBlocking(command);
    }
}
